Linux部署JupyterHub实现多用户使用Jupyterlab |
您所在的位置:网站首页 › jupyterhub spawner › Linux部署JupyterHub实现多用户使用Jupyterlab |
一、安装docker
1、安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2、配置
# 重启docker
systemctl restart docker
# 设置docker为开机自启动
systemctl enable docker
二、拉取镜像并创建容器
1、拉取镜像
docker pull debian:latest
2、创建容器
docker run -itd --hostname=jupyterhub -v /etc/jupyterhub:/etc/jupyterhub --name=jupyterhub --restart=always -p 8000:8000 debian
此处使用debian作为基本镜像进行搭建,也可以使用ubuntu和centos等镜像,对外暴露端口号为8000,若有端口冲突,可改为其他端口,jupyterlab服务运行在容器的8000端口上。 3、进入容器创建完成后进入容器,接下来的众多命令均在容器内执行: docker exec -it jupyterhub /bin/bash 三、安装必要的包 1、更新软件源 apt-get update -y && apt-get upgrade -y && apt-get autoremove -y 2、安装软件 apt-get install vim procps wget -y 四、安装Miniconda3 1、获取下载地址下载地址:Miniconda3清华镜像站下载 选择较新版本,复制链接, ![]() 执行安装后,有几点注意: 刚执行的时候是服务条款,一路按Enter,然后要输入的时候输入yes即可; ![]() 接下来会让确认路径,默认为~/miniconda3,不要装在root用户目录下,建议装在/opt/miniconda3目录下,装root目录下之后会出现很多问题; ![]() 最后询问是否初始化,选择yes; ![]() 安装完成后可删除安装包,以节省硬盘空间 3、验证是否安装成功安装完成后重启终端,然后再进去,再进入发现终端(base)开头,说明安装成功 ![]() nodejs和npm可以使用apt-get包管理工具进行安装: apt install nodejs npm -y但版本可能不是很新,以下提供另一种安装方法: 1、下载node.js中文官网:下载 | Node.js 中文网 (nodejs.cn) 访问界面,选择Linux 二进制文件 (x64),右键复制链接 返回终端,下载: wget https://nodejs.org/dist/v16.17.0/node-v16.17.0-linux-x64.tar.xz解压: tar -xvf ./node-v16.17.0-linux-x64.tar.xz移动并重命名 mv node-v16.17.0-linux-x64/ /opt/nodejs 2、配置环境变量 vim /etc/bash.bashrc追加以下内容: #set for nodejs export NODE_HOME=/opt/nodejs export PATH=$NODE_HOME/bin:$PATH使环境变量立即生效 source /etc/bash.bashrc 3、验证nodejs和npm安装完成,使用以下命令进行验证 node -v # 查看node.js版本 npm -v # 查看npm版本npm、pip和conda的软件源都是国外的,在国内访问比较慢,换源有利于提高下载速度。 1、npm换源 npm config set registry http://registry.npmmirror.com # npm换淘宝源 2、pip换源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # pip换清华源 3、conda换源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yes 七、时区设置不设置时区后续可能会出现一些问题。 终端执行: dpkg-reconfigure tzdata选择时区时选择Asia/Shanghai pycurl必须用conda装,用pip装会报错,或用源码编译安装,没有pycurl就会导致普通用户无法开启jupyterlab 3、需要pip安装的 pip install jupyterlab jupyterhub jupyterhub-idle-culler autopep8 pycodestyle mccabe pycodestyle pydocstyle pyflakes pylint rope yapf whatthepatch解释一下安装的包的含义: jupyterlab:jupyter notebook环境 jupyterhub:jupyterhub主体程序 jupyterhub-idle-culler:用于处理用户空闲进程 九、配置jupyterhub 1、生成配置文件 jupyterhub --generate-config -f /etc/jupyterhub/jupyterhub_config.py 2、编辑配置文件 vim /etc/jupyterhub/jupyterhub_config.py将以下内容追加到配置文件/etc/jupyterhub/jupyterhub_config.py中 import sys c.Authenticator.admin_users = { 'root'} # 管理员用户 # 管理员是否有权在各自计算机上以其他用户身份登录,以进行调试,此选项通常用于 JupyterHub 的托管部署,以避免在启动服务之前手动创建所有用户 c.JupyterHub.admin_access = True c.PAMAuthenticator.open_sessions = False # 解决多用户同时登录问题。 c.Spawner.args = ['--allow-root'] # 允许root用户使用 c.LocalAuthenticator.create_system_users = True # 允许创建其他用户 c.Spawner.notebook_dir = '~' # 设置工作目录 c.Spawner.default_url = '/lab' c.JupyterHub.extra_log_file = '/etc/jupyterhub/jupyterhub.log' # 指定额外的日志 c.JupyterHub.pid_file='/etc/jupyterhub/jupyterhub.pid' # 指定pid文件位置 c.JupyterHub.db_url='/etc/jupyterhub/jupyterhub.sqlite' # 指定数据库文件位置 c.JupyterHub.cookie_secret_file='/etc/jupyterhub/jupyterhub_cookie_secret' # 指定cookie_secret文件位置 c.ConfigurableHTTPProxy.pid_file='/etc/jupyterhub/jupyterhub-proxy.pid' # 设置proxy.pid文件位置 # 设置用户一小时内无使用则关闭jupyterlab服务 c.JupyterHub.services = [ { 'name': 'idle-culler', 'command': [sys.executable, '-m', 'jupyterhub_idle_culler', '--timeout=1800'], } ] c.JupyterHub.load_roles = [ { "name": "list-and-cull", # name the role "services": [ "idle-culler", # assign the service to this role ], "scopes": [ # declare what permissions the service should have "list:users", # list users "read:users:activity", # read user last-activity "admin:servers", # start/stop servers ], } ] 十、启动 (1)正常启动创建启动脚本: vim /etc/jupyterhub/start_jupyterhub.sh写入以下内容: nohup jupyterhub -f /etc/jupyterhub/jupyterhub_config.py > /dev/null 2>&1 &赋予可执行权限: chmod +x /etc/jupyterhub/start_jupyterhub.sh然后执行脚本启动jupyterhub /etc/jupyterhub/start_jupyterhub.sh (2)设置开机自启动若每次启动都需要手动运行脚本来启动是在太麻烦,所以我们将脚本添加到容器的自启动中,让其随着容器的启动而启动。 容器在启动时,会先执行/root/.bashrc文件,我们将要执行的脚本加入其中即可实现jupyterhub随容器的启动而启动 vim /root/.bashrc添加以下内容: if [ -f /etc/jupyterhub/start_jupyterhub.sh ]; then /etc/jupyterhub/start_jupyterhub.sh fi添加完成后,我们可以退出容器,然后让容器重启,看重启后jupyterhub是不是自动启动了 # 重启容器 docker resatrt jupyterhub 十一、访问 1、设置密码在访问前先设置密码,root用户为管理员,docker中的root用户默认是没有密码的,需要我们设置一个: passwd root然后再进行登录 用户登录:http://IP:8000/hub/login 用户管理:http://IP:8000/hub/admin登录的密码是你系统用户的密码。若是要添加用户,在用户管理界面添加用户后,还需要在系统终端中修改密码。 登录界面: ![]() 登陆后的jupyterlab界面: 管理界面: 使用root账户登录管理界面,然后点击Add Users添加用户,添加用户时候,每一行一个用户。可选择Admin设置添加的用户是否是管理员 添加后的界面如下: 添加用户后,可以点击Edit User进行用户的删除、修改用户名和赋予管理员权限等操作。 jupyterhub无法在管理界面设置密码,设置密码需要在终端中进行设置。在jupyterhub终端中添加的用户,将被默认添加到系统用户中,并在/home文件夹下生成相应的用户目录: 因此,修改密码需要在终端中使用passwd命令来修改密码: root用户可直接使用passwd 用户名来修改密码,且修改密码不需要知道当前的密码: 普通用户只能够使用passwd修改自己的密码,且需要之前当前密码,密码也要设置8位及以上: 当需要有大量添加大量用户时,我们就需要使用chpasswd命令来批量修改密码 (1)添加用户首先在管理面板中批量添加用户 然后将用户名和密码对应,写成用户名:密码的形式,存储在文件中,如存储在passwd.txt文件中,文件内容如下所示: lab01:3200201137 lab02:3200204233 lab03:3190707121 lab04:3200201232 lab05:3201902211 lab06:3200209116 lab07:3211902229 lab08:3211901113 lab09:3190113205 lab10:3210204416 lab11:3210204328 lab12:3210204326 lab13:3210204314 lab14:3210204428 lab15:3210201309 lab16:3200204317 lab17:3201901231 lab18:3201901103 lab19:3201901107 lab20:3210201225然后在终端执行以下命令,即可完成用户密码的批量修改 chpasswd 高级设置编辑器->JSON设置编辑器设置->笔记本,勾选自动闭合括号 jupyterlab_code_formatter # 安装插件 pip install jupyterlab_code_formatter # 安装格式化工具 pip install black isort该插件安装后需要重启才生效。 当我们写完代码后,点击如图所示的图标,代码就会被自动格式化: jupyterlab-unfold pip install jupyterlab-unfold 6、绘制可交互图jupyterlab-matplotlib pip install ipympl该插件安装后,使用matplotlib绘图时只要加上以下代码,即可绘制可交互的图像: %matplotlib widget绘制的效果如下,可以点击图中的点查看对应数值,以及放大缩小图像等: ![]() 安装后重启,重启完成后进入到jupyterlab界面,然后进行设置。 进入设置,选择Code Completion,勾选Continuous hinting后刷新界面即可 效果如下,和Pycharm等IDE提供的代码提示类似: 如图所示,可以看到上次执行代码的时间和执行耗时: 安装重启后,在开始页,可以看到增加了两个选项,点击可以创建绘图 创建的绘图界面如下,和drawio相似,其实就是drawio的jupyterlab插件: 当我们安装完插件后,需要进行一些设置才能够使用,但配置后我们发现只有当前用户可以使用,其他用户并没有进行配置。这是因为每个用户配置后相应的配置文件均保存在~/.jupyter文件夹下,若我们需要多个用户同时进行某项配置时,最简单的办法是直接使用配置好的用户的.jupyter文件夹替换要配置用户的文件夹即可,那样所有用户的配置都一样了。 值得注意的是,替换文件夹后要配置相应的权限,以免替换后被替换的用户无法访问配置文件而无法加载。最简单的方法是以下设置: chmod -R 777 .jupyter当用户成百上千的时候,这么替换也属实麻烦,可以编写python或shell脚本去实现替换,以加快效率 十四、解决终端无法正常显示中文 1、安装locales apt-get install locales -y 2、添加配置 dpkg-reconfigure locales选择zh_CN.UTF-8 UTF-8 保证LANG为zh_CN.UTF-8 UTF-8 若不是,可以添加环境变量 export LANG=zh_CN.UTF-8追加到/etc/bash.bashrc文件中,然后再使其生效 source /etc/bash.bashrc 4、效果设置完成后重新打开终端,设置成功 原来的显示 matplotlib绘图代码如下: import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.family'] = ['sans-serif'] plt.rcParams['font.sans-serif'] = ['SimHei'] x=np.linspace(-np.pi,np.pi) y1=np.sin(x) y2=np.cos(x) plt.title("常见三角函数") plt.plot(x,y1,x,y2) plt.show()报错: Font family [‘sans-serif‘] not found.Falling back to DejaVu Sans原因:系统中缺少SimHei字体 2、问题解决 (1)获取matplotlib的字体目录 import patplotlib print(matplotlib.matplotlib_fname()) /opt/miniconda3/lib/python3.9/site-packages/matplotlib/mpl-data/matplotlibrc (2)打开字体目录由上一步获取的地址修改得到 cd /opt/miniconda3/lib/python3.9/site-packages/matplotlib/mpl-data/fonts/ttf (3)下载SimHei字体下载地址:https://www.fontpalace.com/font-download/SimHei/ 下载后复制到上一步得到的字体目录 配置文件即第一步获取的文件 vim /opt/miniconda3/lib/python3.9/site-packages/matplotlib/mpl-data/matplotlibrc修改的几处如下: # 删除前面的#号 font.family: sans-serif # 删除前面的#号,并在后面添加SimHei font.serif: SimHei, DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif # 将True盖为False axes.unicode_minus: False (6)重启重启后再运行没问题了 十六、内存占用问题用户每打开一个Notebook文件,系统就会开始一个jupyter notebook内核进程,用户退出后进程不会自动终止; jupyterhub虽然可以自动释放资源,但并不会释放jupyter notebook内核进程; 当多个用户访问后,内存一直在增加,没有得到释放; 暂时没有好的解决方法,只能够让jupyterhub容器定时重启; 我们使用Linux中的crontab命令设置定时重启jupyterhub容器,crontab是Linux系统下用于执行定时任务的一个工具,用法可以自行百度。 crontab -e添加以下字段: 30 2 * * * docker restart jupyterhub此字段指定每天凌晨2点30分重启jupyterhub容器 之后若有更好的办法再修改。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |